package fiuba.algo3;

import java.util.ArrayList;

import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.w3c.dom.Element;

public class Ladron {
	private String nombre, sexo, hobby, cabello, senia, auto;
	private ObjetoRobado objetoRobado;
	private ArrayList<Ciudad> rutaDeEscape = new ArrayList<Ciudad>();
	
	public Ladron(ObjetoRobado objetoRobado) {
		
		NodeList listaLadrones = new ManejadorXML().obtenerElementosDeXML( "ladrones.xml", "ladron" );

		if (listaLadrones != null){
			int i = new Double(Math.random() * (listaLadrones.getLength())).intValue();
			Element ladron = (Element) listaLadrones.item(i);
			
			this.nombre = ladron.getAttribute("nombre");
			this.sexo = ladron.getAttribute("sexo");
			this.hobby = ladron.getAttribute("hobby");
			this.cabello = ladron.getAttribute("cabello");
			this.senia = ladron.getAttribute("senia");
			this.auto = ladron.getAttribute("auto");
			this.objetoRobado = objetoRobado;
			
			int cantidadDeCiudades = this.calcularCantidadDeCiudades();
			this.estrategiaDeEscape(cantidadDeCiudades);
		}
	}
	
	public Ladron() {}
	
	public Node serializar(Document doc) {
		Element elementoLadron = doc.createElement("Ladron");
		elementoLadron.setAttribute("nombre", this.nombre);
		elementoLadron.setAttribute("sexo", this.sexo);
		elementoLadron.setAttribute("hobby", this.hobby);
		elementoLadron.setAttribute("cabello", this.cabello);
		elementoLadron.setAttribute("senia", this.senia);
		elementoLadron.setAttribute("auto", this.auto);
		
		elementoLadron.appendChild(this.objetoRobado.serializar(doc));
		
		Element elementoRutaDeEscape = doc.createElement("RutaDeEscape");
		elementoLadron.appendChild(elementoRutaDeEscape);
		for (Ciudad ciudad : this.rutaDeEscape) {
			elementoRutaDeEscape.appendChild( ciudad.serializar(doc) );
		}
		return elementoLadron;
	}
	
	public static Ladron hidratar(Node elementoLadron) {
		Ladron nuevoLadron = new Ladron();
		nuevoLadron.nombre = ((Element)elementoLadron).getAttribute("nombre");
		nuevoLadron.sexo = ((Element)elementoLadron).getAttribute("sexo");
		nuevoLadron.hobby = ((Element)elementoLadron).getAttribute("hobby");
		nuevoLadron.cabello = ((Element)elementoLadron).getAttribute("cabello");
		nuevoLadron.senia = ((Element)elementoLadron).getAttribute("senia");
		nuevoLadron.auto = ((Element)elementoLadron).getAttribute("auto");
			
		nuevoLadron.objetoRobado = ObjetoRobado.hidratar( ((Element) elementoLadron).getElementsByTagName("ObjetoRobado").item(0) );
		
		ArrayList<Ciudad> rutaDeEscape = new ArrayList<Ciudad>();
		Element elementoRutaDeEscape =  (Element) ((Element) elementoLadron).getElementsByTagName("RutaDeEscape").item(0);
		for(int i=0; i< elementoRutaDeEscape.getChildNodes().getLength(); i++) {
			Ciudad ciudad = Ciudad.hidratar(elementoRutaDeEscape.getChildNodes().item(i));
			rutaDeEscape.add(ciudad);
		}
		nuevoLadron.rutaDeEscape = rutaDeEscape;
		
		return nuevoLadron;	
	}
	
	//GETTERS
	public String getNombre() {
		return nombre;
	}

	public String getSexo() {
		return sexo;
	}

	public String getHobby() {
		return hobby;
	}

	public String getCabello() {
		return cabello;
	}

	public String getSenia() {
		return senia;
	}

	public String getAuto() {
		return auto;
	}
		
	public ArrayList<Ciudad> getRutaDeEscape(){
		return this.rutaDeEscape;
	}
	// FIN GETTERS

	private int calcularCantidadDeCiudades() {
		switch( this.objetoRobado.getValor() ){
		case COMUN: return 3;
		case VALIOSO: return 4;
		case MUY_VALIOSO: return 6;
		}
		return 0;
	}
	
	private void estrategiaDeEscape(int cantidadDeCiudades){
		Ciudad ciudadDelRobo = this.objetoRobado.getCiudad();
		this.rutaDeEscape.add(ciudadDelRobo);

		NodeList listaCiudades = new ManejadorXML().obtenerElementosDeXML( "ciudades.xml", "ciudad" );

		if (listaCiudades != null){		
			while (cantidadDeCiudades != 0){
				
				// Creo una ciudad aleatoria
				int i = new Double(Math.random() * (listaCiudades.getLength())).intValue();
				Element elementoCiudad = (Element) listaCiudades.item(i);
        		Ciudad posibleCiudad = new Ciudad (elementoCiudad.getAttribute("nombre"));
				
				// Recorro la rutaDeEscape para verificar que no se repita la ciudad
        		boolean seRepite = false;
            	for ( int j = 0; j < this.rutaDeEscape.size(); j++ ){
            		Ciudad ciudadDeRuta = this.rutaDeEscape.get(j);
            		
            		if ( ciudadDeRuta.esIgualA(posibleCiudad) ){ seRepite = true; break; }
            	}
            	
            	if (!seRepite){
             		this.rutaDeEscape.add(posibleCiudad);
        			cantidadDeCiudades = cantidadDeCiudades - 1;
            	}
			}
		}
	}
	
	public void esconderse(ArrayList<Edificio> edificios){
		int x = new Double(Math.random() * 3).intValue();
		edificios.get(x).esconderAlLadron(true);
	}
	
	public boolean esHombre(){
		return this.sexo.equals("masculino");
	}
	
}
